<?php
/**
 * Modelo de CRUD Abstrato
 * Manipula uma tabela no banco de dados
 * @author Emanuel Melo @ PC4 Team
 */
class Abstrato extends PC4_Crud_Abstrato {
	
	function insere($umRegistro, $procedure) {
		$erros = $this->valida($umRegistro);
		$valores = implode(',', $this->trataRegistro($umRegistro));
		if (empty($erros)) {
			$this->db->query("call $procedure($valores)");
			if ($this->db->affected_rows() > 0) {
				$id = current($this->db->query('SELECT @@IDENTITY id')->result());
				return $id->id;
			}
		}
		return $erros;
	}
	
	function edita($umRegistro, $procedure, $valor = null, $campo = 'id') {
		$erros = $this->valida($umRegistro, $valor, $campo);
		if (empty($erros)) {
			$valores = implode(',', $this->trataRegistro($umRegistro));
			if (!empty($valor)) {
				$this->db->query("call $procedure($valores, '$valor')");
			}
			else {
				$this->db->query("call $procedure($valores, null)");
			}
		}
		return $erros;
	}
	
	function apaga($procedure, $valor, $campo = 'id') {
		$this->db->query("call $procedure('$valor')");
		$affected_rows = $this->db->affected_rows();
		return $affected_rows;
	}
	
	function trataRegistro($registro) {
		foreach ($registro as &$r) {
			if (!empty($r)) {
				$r = "'$r'";
			}
			else {
				$r = "null";
			}
		}
		return $registro;
	}
	
/**
	 * Executa uma consulta trazendo os registros com paginação
	 * @param int $pagina
	 * @param int $limite
	 * @return array de object registro
	 */
	function lista($pagina = 1, $limite = -1, $debug = false) {
		if ($limite != -1) {
			$offset = ($pagina - 1) * $limite;
			$this->db->limit($limite, $offset);
		}
		$this->db->from($this->tabela . " " . $this->letra);
		$rs = $this->db->get()->result();
		if ($debug) {
			d($this->db->last_query(), "lista($pagina, $limite)", 1);
		}
		if ($debug) {
			d($rs, 'resultado');
		}

		return $rs;
	}
}

